<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    1. typeof
      不能区分null/object/array, 其它类型都可以
    2. A instanceof B
      判断一个对象是否是某个类型的, 可以用来判断它的具体类型
      能区分null/object/array
    3. Array.isArray()
      专门用来判断数组
    4. ===
      判断两个数据(可以两个任意类型的变量)是否完全相等(类型和值)
      判断undefined和null类型    
    5. Object.prototype.toString.call(obj),slice(8, -1)
        所有数据类型都可以判断
        Object原型对象上的toString返回: '[object 类型名称]' => 类型名称
        注意: 具体类型可能已经重写toString, 不能直接调用toString, 只能通过call调用
    */

    Object.prototype.toString.call(123).slice(8, -1); // 'Number'
    Object.prototype.toString.call("123").slice(8, -1); // 'String'
    Object.prototype.toString.call(null).slice(8, -1); // 'Null'
    Object.prototype.toString.call(undefined).slice(8, -1); // 'Undefined'
    Object.prototype.toString.call(Symbol()).slice(8, -1); // 'Symbol'
    Object.prototype.toString.call(123n).slice(8, -1); // 'BigInt'
    Object.prototype.toString.call(true).slice(8, -1); // 'Boolean'
    Object.prototype.toString.call({}).slice(8, -1); // 'Object'
    Object.prototype.toString.call(function () {}).slice(8, -1); // 'Function'
    Object.prototype.toString.call([]).slice(8, -1); // 'Array'
    Object.prototype.toString.call(new Date()).slice(8, -1); // 'Date'
    Object.prototype.toString.call(new RegExp()).slice(8, -1); // 'RegExp'
  </script>
</body>
</html>